package com.guimin.common.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.io.Serializable;

/**
 * API返回结果
 * @author hzy
 * @param <T>
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class R<T> implements Serializable {
	/**
	 * 响应状态(true成功,false失败)
	 */
	public Boolean success;
	/**
	 * 响应状态代码
	 */
	private String code;
	/**
	 * 描述消息
	 */
	private String message;
	/**
	 * 错误体
	 */
	private Object errBody;
	/** 
	 * 结果集
	 */
	private T data;

	/**
	 * 成功
	 * @return R
	 */
	public static <T> R<T> success() {
		R<T> r=new R<>();
		r.success=true;
		return r;
	}
	/**
	 * 成功
	 * @param message 响应消息
	 * @return R
	 */
	public static <T> R<T> success(String message) {
		R<T> r=new R<>();
		r.success=true;
		r.message=message;
		return r;
	}
	/**
	 * 成功,返回数据
	 * @param data 数据
	 * @return r
	 */
	public static <T> R<T> success(String message, T data) {
		R<T> r=new R<>();
		r.success=true;
		r.message=message;
		r.data= data;
		return r;
	}
	/**
	 * 成功
	 * @param code 响应码
	 * @param message 响应消息
	 * @param data 响应数据
	 * @return r
	 */
	public static <T> R<T> success(String code, String message, T data) {
		R<T> r=new R<>();
		r.success=true;
		r.code=code;
		r.message=message;
		r.data=data;
		return r;
	}
	/** 
	 * 失败
	 * @return r
	 */
	public static <T> R<T> fail() {
		R<T> r=new R<>();
		r.success=false;
		return r;
	}
	/**
	 * 失败
	 * @param message 响应消息
	 * @return r
	 */
	public static <T> R<T>  fail(String message) {
		R<T> r=new R<>();
		r.success=false;
		r.message=message;
		return r;
	}
	/**
	 * 失败,返回错误代码、错误消息
	 * @param message 响应消息
	 * @param data 响应数据
	 * @return r
	 */
	public static <T> R<T> fail(String message, T data) {
		R<T> r=new R<>();
		r.success=false;
		r.message=message;
		r.data=data;
		return r;
	}
	/** 
	 * 失败,返回错误代码、错误消息
	 * @param code 错误代码
	 * @param message 错误描述消息
	 * @param errBody 错误体
	 * @return r
	 */
	public static <T> R<T> fail(String code, String message, Object errBody) {
		R<T> r=new R<>();
		r.setSuccess(false);
		r.code=code;
		r.message=message;
		r.errBody=errBody;
		return r;
	}
}
